package engine.stars;

/**
 * Класс звезды главной последовательности.
 * 
 * @author Oleksij Golenko
 */
public class RegularStar extends Star {
	/* Имя звезды. */
	private String name;
	/* Спектральный класс звезды. */
	private int spectralClass;
	/* температура звезды. */
	private int temperature;
	/* Размер звезды. */
	private double size;
	/* Цвет звезды. */
	private int color;
	/* Светимость звезды. */
	private int luminocity;
	/* Количество планет. */
	private int planetsQuantity;

	/**
	 * Создаёт экземпляр звезды главной последовательности.
	 */
	public RegularStar() {
		StarGenerator sg = StarGenerator.getInstance();

		spectralClass = sg.generateSpectralClass();
		planetsQuantity = sg.generatePlanetsQuantity();

		temperature = sg.generateTemperature(spectralClass);
		size = sg.generateSize(spectralClass);
		color = sg.generateColor(spectralClass);
		luminocity = sg.generateLuminocity(spectralClass);

		name = sg.generateUniqueName(getNameModifier());
	}

	/**
	 * Возвращает модификатор имени.
	 * 
	 * @return модификатор имени
	 * @throws IllegalStateException не верный или не проинициализированный
	 *         спектральный класс звезды
	 */
	private String getNameModifier() throws IllegalStateException {
		switch (spectralClass) {
			case Star.SPECTRAL_CLASS_M:
				return "M";

			case Star.SPECTRAL_CLASS_K:
				return "K";

			case Star.SPECTRAL_CLASS_G:
				return "G";

			case Star.SPECTRAL_CLASS_F:
				return "F";

			case Star.SPECTRAL_CLASS_A:
				return "A";

			case Star.SPECTRAL_CLASS_B:
				return "B";

			case Star.SPECTRAL_CLASS_O:
				return "O";

			default:
				throw new IllegalStateException();
		}
	}

	/* Методы доступа к защищенным переменным класса */

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @param spectralClass the spectralClass to set
	 */
	public void setSpectralClass(int spectralClass) {
		this.spectralClass = spectralClass;
	}

	/**
	 * @param temperature the temperature to set
	 */
	public void setTemperature(int temperature) {
		this.temperature = temperature;
	}

	/**
	 * @param size the size to set
	 */
	public void setSize(double size) {
		this.size = size;
	}

	/**
	 * @param color the color to set
	 */
	public void setColor(int color) {
		this.color = color;
	}

	/**
	 * @param luminocity the luminocity to set
	 */
	public void setLuminocity(int luminocity) {
		this.luminocity = luminocity;
	}

	/**
	 * @param planetsQuantity the planetsQuantity to set
	 */
	public void setPlanetsQuantity(int planetsQuantity) {
		this.planetsQuantity = planetsQuantity;
	}

	/**
	 * Возвращает спектральный класс звезды.
	 * 
	 * @return спектральный класс звезды
	 */
	public int getSpectralClass() {
		return spectralClass;
	}

	/**
	 * Возвращает количество планет, вращающихся вокруг звезды.
	 * 
	 * @return количество планет
	 */
	public int getPlanetsQuantity() {
		return planetsQuantity;
	}

	@Override
	public int getTemperature() {
		return temperature;
	}

	@Override
	public double getSize() {
		return size;
	}

	@Override
	public int getColor() {
		return color;
	}

	@Override
	public int getLuminocity() {
		return luminocity;
	}

	@Override
	public String getName() {
		return name;
	}
}
